This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies.
A software factory is a structured collection of related software assets. When a software factory is installed in a development environment, it helps architects and developers predictably and efficiently create high-quality instances of specific types of applications. Each software factory is designed to help build applications that share an architecture and a feature set. Examples of such application types include mobile client applications, occasionally connected smart client applications, and transactional Web service applications.
A software factory contains a variety of software assets and software tools. Software assets include reusable code components, documentation, and reference implementations. Software tools include wizards, code generators, and visual designers. Typically, a software factory provides templates and other tools to help a development team quickly start development of new applications. It also continues to assist the developers by providing guidance and automation of the prescribed development activities throughout the application development life cycle.
A key characteristic of a software factory is that architects and developers can customize, extend, and adjust it to address the unique needs of a project team or an organization. Typically, an architect performs this customization, and then the architect repackages and distributes the software factory to the project teams.
Developing with a Software Factory
Software factory–based application development addresses the problem of traditional application development where applications are developed and delivered without taking advantage of the knowledge gained and the assets produced from developing similar applications. Many approaches, such as training, documentation, and frameworks, are used to address this problem. However, using these approaches to consistently apply the valuable knowledge previously gained during development of multiple applications can be an inefficient and error-prone process.
Software factories address this problem by encoding proven practices for developing a specific style of application within a package of integrated guidance that is easy for project teams to adopt. Developing applications using a suitable software factory can provide many benefits, including the following, when compared with conventional software development approaches:
- Consistency. Using a software factory to build multiple instances of a software product line (a set of applications that share features and architecture) makes it easier to achieve consistency. This simplifies governance and lowers maintenance and training costs.
- Quality. Using a software factory makes it easier for developers to learn and implement proven practices. Developers spend less time writing boilerplate code and spend more time creating features that are unique to each application. This reduces the likelihood of the application having design flaws or code defects. Applications developed using a software factory might also be verified before deployment. This ensures that factory-specific best practices were followed during development.
Productivity. Using a software factory streamlines and automates the prescribed application development activities in the following ways:
- It reuses software assets, particularly extensible architecture baselines, application frameworks, and application blocks.
- It provides contextualized and automated guidance.
- It generates code from models that represent abstractions of the application elements and mechanisms.
What Is Included in a Software Factory
Like applications, each software factory is unique and might include a unique set of assets designed to help build a specific type of application. However, most software factories include interrelated assets of the following types:
- Factory schema. The schema illustrates the activities (grouped into viewpoints) and assets to use when building applications.
- Reference implementation. A reference implementation provides an example of a realistic, finished product that the software factory helps developers build.
- Architecture guidance and patterns. Architecture guidance and patterns help explain application design choices and the motivation for those choices.
- How-to topics. How-to topics describe procedures for completing tasks.
- Recipes. Recipes automate procedures in how-to topics, either entirely or selected steps. They help developers to complete routine tasks with minimal input.
- Templates. Templates are prefabricated application elements with placeholders for concrete arguments. They can be used for many purposes, including creating initial solution structures to creating individual solution artifacts, such as project items.
- Designers. Designers provide information that architects and developers can use to model applications at a higher level of abstraction. Designers can also generate code that is compatible with the architecture baseline.
- Reusable code. Reusable code consists of components, such as frameworks or application blocks, that implement common functionality or mechanisms. The integration of reusable code in a software factory reduces the requirements for manually written code and encourages reuse across applications.
Why Consider Using a Software Factory?
If the software factory matches the requirements of your scenario, using it makes the development of your application faster, easier, less expensive, and more predictable. Instead of having to build the application from scratch, you only have to build the application-specific parts. The software factory provides the rest.
A software factory captures the proven best practices and reusable assets in a way that should be easy to learn and use. It eliminates the unnecessary exploration or reinvention and allows developers to focus on what is most important: meeting customer requirements on time and with quality.
Finally, yet very importantly, a software factory is customizable and extensible. Developers can fine-tune the activities, assets, and tools to reflect their teams' unique requirements and environment.